package proxy.demo3;

import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;

import java.lang.reflect.Method;

/**
 * @author wangshihao
 * @description: cglib代理类, 需要实现MethodInterceptor接口, 并指定代理目标类
 * @date 2024-08-27 14:34
 */
public class UserLogProxy implements MethodInterceptor {

    /**
     * 目标对象
     */
    private final Object target;

    /**
     * 构造方法注入目标对象
     */
    public UserLogProxy(Object target) {
        this.target = target;
    }

    public Object getLogProxy() {
        //增强器类,用来创建动态代理类
        Enhancer en = new Enhancer();
        //设置代理类的父类字节码对象
        en.setSuperclass(target.getClass());
        //设置回调: 对于代理类上所有方法的调用,都会调用CallBack,而CallBack则需要实现intercept()方法进行拦截
        en.setCallback(this);
        //创建代理对象并返回
        return en.create();
    }

    /**
     * 实现回调方法
     *
     * @param o           代理对象
     * @param method      目标对象中的方法的method的实例
     * @param objects     实际参数
     * @param methodProxy 代理对象中的method的实例
     * @description: 实现回调方法
     * @author wangshihao
     * @date 2024-08-27 14:52
     */
    public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
        //封装打印日志增强方法
        System.out.println("before: 业务开始执行了...日志打印");
        //代理类执行方法
        Object result = methodProxy.invokeSuper(o, objects);
        System.out.println("after: 业务结束了...日志打印");
        return result;
    }
}
